package Servlets;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import com.akcess.vo.*;
import com.akcess.exception.*;
import com.akcess.impl.RolDAOImpl;
import manejadores.*;
import java.sql.*;

public class SessionLogin extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setAttribute("error", new Boolean("false"));
        String terminarSesion = (String) request.getParameter("salir");
        HttpSession session = request.getSession(false);
        //Para editar el perfil....
        String hacer = (String) request.getParameter("hacer");
        if (hacer != null && session != null) {
            Usuarios user = (Usuarios) session.getAttribute("datosUser");
            if (hacer.equals("Perfil")) {
                Integer entero = new Integer(user.getId_usuario());
                request.setAttribute("nombreUser", user.getNombre());
                request.setAttribute("id", entero);
                request.setAttribute("Perfil", "SI");
                RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/Usuarios/ModificarUsuario.jsp");
                dispatcher.forward(request, response);
            }

        }

        if (terminarSesion != null && terminarSesion.compareTo("true") == 0) {
            if (session != null) {
                try {
                    Connection cone;
                    cone = (Connection) session.getAttribute("conexion");
                    //Cierro conexion a la BD si es que existe conexion.
                    if (cone != null) {
                        cone.close();
                    }
                    session.invalidate();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }

            }
            RequestDispatcher dispatcher = request.getRequestDispatcher("jsp/login.jsp");
            dispatcher.forward(request, response);
        } else {
            RequestDispatcher dispatcher = request.getRequestDispatcher("jsp/login.jsp");
            dispatcher.forward(request, response);
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            String hacer = (String) request.getParameter("hacer");

            if (hacer != null) {
                if (hacer.equals("modificacion")) {
                    this.ModificarUsuario(request, response);
                    RequestDispatcher dispatcher = request.getRequestDispatcher("./");
                    dispatcher.forward(request, response);
                }
            } else {

                String userName = request.getParameter("usuario");
                String password = request.getParameter("contrasenha");
                Usuarios user = login(userName, password);
                HttpSession session;

                if (user != null) {
                    //send cookie to the browser
                    session = request.getSession(true);
                    session.setAttribute("estaDentro", new String("true"));
                    session.setAttribute("datosUser", user);

                    //Voy a guardar en la sesion la conexion a la BD que tiene el usuario.
                    ConexionDB cone = new ConexionDB();
                    cone.ConectarDB();
                    session.setAttribute("conexion", cone.getConxion());

                    RequestDispatcher dispatcher = request.getRequestDispatcher("jsp/index.jsp");
                    dispatcher.forward(request, response);
                } else {
                    request.setAttribute("error", new Boolean("true"));
                    RequestDispatcher dispatcher = request.getRequestDispatcher("jsp/login.jsp");
                    dispatcher.forward(request, response);
                }
            }
        } catch (Exception ex) {
            try {
                //Utilizo un metodo publico y estatico que redirecciona los errores de pagina
                GestionarUsuarios.sendErrorRedirect(request, response, "jsp/errores/errorGenerico.jsp", ex);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static Usuarios login(String userName, String password) throws Exception {

        Usuarios userBD = null;
        ConexionDB cone = new ConexionDB();
        cone.ConectarDB();
        ManejadorUsuarios userManager = new ManejadorUsuarios(cone.getConxion());
        userBD = userManager.traerUsuarioXnombreOp(userName);

        if (userBD != null) {
            if (password.compareTo(userBD.getContrasena()) == 0) {

                // Busco los permisos que tiene el usuario para llenar el objeto usuario.
                NombresModulosOperaciones[] permisos = userManager.BuscarPermisosDeUser(userBD);
                userBD.setPermisos(permisos);
                cone.DesconectarDB();
                return userBD;
            } else {
                cone.DesconectarDB();
            }
        } else {
            cone.DesconectarDB();
        }

        return null;

    }

    protected void ModificarUsuario(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            int idRol = Integer.parseInt(request.getParameter("id"));
            String nrodoc = request.getParameter("NroDoc");
            String nombre = request.getParameter("Nombre");
            String apellido = request.getParameter("Apellido");
            String nombreoperativo = request.getParameter("NombreOperativo");
            String direccion = request.getParameter("Direccion");
            String telefono = request.getParameter("Telefono");
            String celular = request.getParameter("Celular");
            String fax = request.getParameter("Fax");
            String observacion = request.getParameter("Observacion");
            String email = request.getParameter("Email");
            String contrasena = request.getParameter("Contrasena");

            Usuarios usuario = new Usuarios();
            usuario.setNrodoc(nrodoc);
            usuario.setNombre(nombre);
            usuario.setApellido(apellido);
            usuario.setNombreoperativo(nombreoperativo);
            usuario.setDireccion(direccion);
            usuario.setTelefono(telefono);
            usuario.setCelular(celular);
            usuario.setFax(fax);
            usuario.setObservacion(observacion);
            usuario.setEmail(email);
            usuario.setContrasena(contrasena);
            
            //Para guardar el operador de la modificacion
            Usuarios user = null;

            HttpSession session = request.getSession(false);
            if (session != null) {
                Connection cone;
                cone = (Connection) session.getAttribute("conexion");
                user = (Usuarios) session.getAttribute("datosUser");
                if (cone != null) {
                    usuario.setId_operador(user.getId_usuario());
                    ManejadorUsuarios manejadorUser = new ManejadorUsuarios(cone);
                    manejadorUser.ModificarUsuario(idRol, usuario,true);
                }
            }
        } catch (UsuariosException ex) {
            ex.printStackTrace();
        }
    }
}